package main

import "fmt"

/**
最重要的两个符号：
	&符号 ： 可以获取变量的内存地址
	*符号 ： 可以根据地址取值

1 可以通过指针改变指向值
2 指针变量接收的一定是地址值
3 指针变量的类型必须和指针变量指向的类型一致
4 基本数据类型（值类型），都有对应的指针类型，形式为*数据类型
	eg：
		int -> *int
		float64 -> *float64
*/
func main() {
	test1()
	a := 10
	b := a
	c := &a
	a = 20
	fmt.Println("c指向的值为：", *c)
	fmt.Println("b的值为：", b)

	*c = 40
	b = 30
	fmt.Println("a的值为：", a)
	fmt.Println("c指向的值为：", *c)
}

func test1() {
	var a int = 10
	// &符号 + 变量 就可以获取这个变量的内存地址
	fmt.Println(&a) //0xc00000a0b8

	// 定义一个指针变量
	// var 代表要声明一个变量
	// ptr 指针变量的名字
	// ptr对应的类型是： *int 代表指针变量的类型 （可以理解为 指向int类型的指针）
	var ptr *int = &a
	fmt.Println(ptr)

	fmt.Println("ptr本身这个存储空间的地址为：", &ptr)
	fmt.Printf("ptr指向的数值为：%v \n", *ptr)

	fmt.Println("tom--------------------")
	var str string = "tom"
	var ptr2 *string = &str
	fmt.Println("tom指向的地址为：", &str)
	fmt.Println("ptr2指向的地址为：", ptr2) // 这个地址和str的地址一样，都是指向str的地址
	fmt.Printf("ptr2指向的数值为：%v \n", *ptr2)
	fmt.Println("tom- end-------------------")
}
